﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace OutoLiiga
{
    public class Liiga : INotifyPropertyChanged
    {
        public Liiga() { }

        ObservableCollection<Pelaaja> pelaajat = new ObservableCollection<Pelaaja>();
        public ObservableCollection<Pelaaja> Pelaajat
        {
            get { return pelaajat; }
        }

        Pelaaja valittuPelaaja = null;
        public Pelaaja ValittuPelaaja
        {
            get { return valittuPelaaja; }
            set
            {
                SetField(ref valittuPelaaja, value, "ValittuPelaaja");
            }
        }

        string message;
        public string Message
        {
            get { return message; }
            set
            {
                SetField(ref message, value, "Message");
            }
        }

        public void UusiPelaaja(string etunimi, string sukunimi, decimal siirtohinta, string seura)
        {
            var pelaaja = new Pelaaja(
                etunimi,
                sukunimi,
                siirtohinta,
                seura);

            if (Pelaajat.Any(p => p.KokoNimi == pelaaja.KokoNimi)) {
                Message = "Pelaaja on jo listalla";
                return;
            }

            Pelaajat.Add(pelaaja);
            ValittuPelaaja = pelaaja;

            Message = "Uusi pelaaja lisätty";
        }

        public void PaivitaValittuPelaaja(string etunimi, string sukunimi, decimal siirtohinta, string seura)
        {
            if (ValittuPelaaja == null) {
                Message = "Pelaajaa ei voitu päivittää. Ei pelaajaa valittuna.";
                return;
            }

            ValittuPelaaja.Etunimi = etunimi;
            ValittuPelaaja.Sukunimi = sukunimi;
            ValittuPelaaja.Siirtohinta = siirtohinta;
            ValittuPelaaja.Seura = seura;

            Message = "Pelaaja päivitetty";
        }

        public void PoistaValittuPelaaja()
        {
            if (ValittuPelaaja == null) {
                Message = "Pelaajaa ei voitu poistaa. Ei pelaajaa valittuna.";
                return;
            }

            Pelaajat.Remove(ValittuPelaaja);

            Message = "Pelaaja poistettu";
        }

        public void TallennaPelaajat()
        {
            using (var stream = File.Open("liiga.dat", FileMode.Create)) {
                var list = new List<Pelaaja>(pelaajat.AsEnumerable());
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(stream, list);
            }
        }

        public void LataaPelaajat()
        {
            using (var stream = File.Open("liiga.dat", FileMode.Open)) {
                BinaryFormatter bf = new BinaryFormatter();
                var list = (List<Pelaaja>)bf.Deserialize(stream);
                foreach (var p in list)
                    pelaajat.Add(p);
            }
        }

        #region INotifyPropertyChanged interface

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

            Trace.TraceInformation("{0} changed", propertyName);
        }

        protected void SetField<T>(ref T field, T value, string propertyName)
        {
            if (EqualityComparer<T>.Default.Equals(field, value))
                return;

            field = value;

            Trace.TraceInformation("{0} set to {1}", propertyName, value);

            OnPropertyChanged(propertyName);
        }

        #endregion
    }
}
